#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

// 1.不定参宏的使用
#define LOG(fmt, ...) printf("[%s:%d]" fmt, __FILE__, __LINE__, ##__VA_ARGS__)
// ##的作用是当不定参为空的时候，直接输出fmt

// 2.不定参函数的使用
void Print(int num, ...) // 第一个参数num表示不定参的个数
{
    va_list va;
    va_start(va, num); // 让va指向不定参的起始位置
    for (int i = 0; i < num; ++i)
    {
        int ret = va_arg(va, int); // 第二个参数表明不定参的类型
        printf("num[%d]-%d\n", i, ret);
    }
    va_end(va); // 将va置为空!
}

void myprintf(const char* fmt, ...)
{
    va_list va;
    va_start(va, fmt);
    char* ret;
    int n = vasprintf(&ret, fmt, va);
    if(n != -1)
    {
        printf(ret);
        free(ret);//使用完记得释放
    }
    va_end(va);
    
}

int main()
{
    // printf("[%s:%d]%s-%d\n", __FILE__, __LINE__, "你好世界", 123);
    // LOG("%s-%d\n", "holle world", 666);
    // LOG("nihao\n");

    //Print(2, 777, 666);
    //Print(5, 5, 4, 3, 2, 1);
    
    myprintf("[%s:%d]%s-%d\n", __FILE__, __LINE__, "你好世界", 123);

    return 0;
}